import globals from 'globals'
import pluginVue from 'eslint-plugin-vue'
import pluginTs from '@typescript-eslint/eslint-plugin'
import prettierPlugin from 'eslint-plugin-prettier'
import tsParser from '@typescript-eslint/parser'
import vueParser from 'vue-eslint-parser'
import babelParser from '@babel/eslint-parser'
import { defineConfigWithVueTs } from '@vue/eslint-config-typescript'
import skipFormatting from '@vue/eslint-config-prettier/skip-formatting'

/**
 * Copyright (c) 2025-Now http://eslint.org/docs/rules/ All rights reserved.
 * No deletion without permission, or be held responsible to law.
 * @author Aurora_api
 */

export default defineConfigWithVueTs(
  // 公共基础配置
  {
    languageOptions: {
      // 支持最新 ECMAScript 语法
      ecmaVersion: 'latest',
      // 强制模块化开发
      sourceType: 'module',
      // 注入浏览器 / Node 全局变量
      globals: {
        ...globals.browser,
        ...globals.node,
        // 支持 Vue 3.3+ 的 defineOptions 宏
        defineOptions: 'readonly',
      },
      parserOptions: {
        requireConfigFile: false,
      },
    },
    rules: {
      // 允许在 switch 中声明变量
      'no-case-declarations': 'off',
      // 允许 !! 强制类型转换
      'no-extra-boolean-cast': 'off',
      // 关闭未定义变量检查（由 TS 接管）
      'no-undef': 'off',
      // 关闭函数括号前的空格检查
      'space-before-function-paren': 'off',
      // 行末禁止加空格
      "no-trailing-spaces": 2,
      // 空行不能够超过 2行
      "no-multiple-empty-lines": [2, { "max": 2 }],
      // 不要重复申明一个变量
      "no-redeclare": 2,
      // 禁止使用不规则的空白符
      "no-irregular-whitespace": 2,
      // 禁止使用多余的圆括号
      "no-extra-parens": [2, "functions"],
      // 规定使用 tab 来进行缩进 switch 中 case 也需要一个 tab
      "indent": [2, "tab", { "SwitchCase": 1 }],
      // 优先使用 const 声明不变变量
      'prefer-const': 'error',
      // 强制使用 === 和 !==
      'eqeqeq': ['error', 'always'],
      // 禁止使用 var
      'no-var': 'error',
      // 强制使用单引号作为字符串引号
      'quotes': ['error', 'single'],
      // 强制语句结尾加分号
      'semi': ['error', 'always'],
      // 单行代码长度限制为 100 字符 提升可读性 超长代码需换行
      'max-len': ['error', { code: 100 }],
      // 多行结构必须尾随逗号
      'comma-dangle': ['error', 'always-multiline'],
      // 箭头函数参数按需使用括号
      'arrow-parens': ['error', 'as-needed'],
      // 箭头函数箭头前后空格 const fn = a => a*2
      'arrow-spacing': ['error', { before: true, after: true }],
      // 强制对象花括号内使用空格 统一代码风格 const obj = { key: 'value' }
      'object-curly-spacing': ['error', 'always'],
      // 数组方括号内不允许空格 const arr = [1,2,3]
      'array-bracket-spacing': ['error', 'never'],
      // 计算属性方括号内不允许空格 obj[property]
      'computed-property-spacing': ['error', 'never'],
      // 关键字前后必须有空格 if (condition) {}
      'keyword-spacing': ['error', { before: true, after: true }],
      // 强制所有控制语句使用大括号 避免逻辑错误 if (condition) { doSomething() }
      'curly': ['error', 'all'],
      // 禁止对象字面量中重复键名 避免数据覆盖 const obj = { a: 1, a: 2 } 错误
      'no-dupe-keys': 'error',
      // 强制使用模板字符串 `${}` 代替字符串拼接 提升可读性
      'prefer-template': 'error',
      // 强制 parseInt 指定进制参数 避免八进制解析问题 parseInt('10', 10)
      'radix': ['error', 'as-needed'],
    },
  },

  // Vue -> 配置
  {
    files: ['**/*.vue'],
    // 启用 Vue 插件
    plugins: {
      vue: pluginVue,
    },
    languageOptions: {
      // 使用 vue-eslint-parser 解析 .vue 文件
      parser: vueParser,
      parserOptions: {
        // 子解析器配置
        parser: {
          // <script lang="ts"> 使用 TS 解析器
          ts: tsParser,
          // tsx 使用 TS 解析器
          tsx: tsParser,
          // 普通 JS 使用 Babel 解析器（支持装饰器等语法）
          js: babelParser,
          '<template>': 'espree',
        },
        ecmaFeatures: {
          // 允许使用 jsx
          jsx: true,
        },
      },
    },
    rules: {
      // 确保 <script setup> 中定义的变量在 <template> 中被使用时不被误判为未使用
      'vue/script-setup-uses-vars': 'error',
      // 允许使用 Vue 内置组件名 如 component
      'vue/no-reserved-component-names': 'off',
      // 关闭自定义事件名的格式检查 默认强制 camelCase
      'vue/custom-event-name-casing': 'off',
      // 禁用属性顺序强制要求 默认顺序：v-if → v-for → v-model → 其他属性 - 关闭后允许自由排列
      'vue/attributes-order': 'off',
      // 允许单个文件包含多个组件定义 - 常用于小型组件或逻辑紧密相关的组件组合
      'vue/one-component-per-file': 'off',
      // 允许闭合标签与内容同行 <div class="example"></div>
      'vue/html-closing-bracket-newline': 'off',
      // 允许单行包含多个属性
      'vue/max-attributes-per-line': 'off',
      // 多行元素内容无需强制换行 如 <div>...</div> 可单行
      'vue/multiline-html-element-content-newline': 'off',
      // 单行元素内容无需强制换行 如 <span>text</span> 可保持紧凑
      'vue/singleline-html-element-content-newline': 'off',
      // 允许属性名使用驼峰式
      'vue/attribute-hyphenation': 'off',
      // 不强制要求为组件 Props 设置默认值
      'vue/require-default-prop': 'off',
      // 不强制显式声明 emits 事件
      'vue/require-explicit-emits': 'off',
      // 允许单字组件名
      'vue/multi-word-component-names': 'off',
      // 自闭合标签规则
      'vue/html-self-closing': [
        'error',
        {
          html: {
            void: 'always',
            normal: 'never',
            // 组件强制自闭合
            component: 'always',
          },
          svg: 'always',
          math: 'always',
        },
      ],
    },
  },

  // TypeScript -> 配置
  {
    files: ['**/*.ts', '**/*.tsx'],
    plugins: {
      '@typescript-eslint': pluginTs,
    },
    languageOptions: {
      // 使用 @typescript-eslint/parser
      parser: tsParser,
      parserOptions: {
        ecmaFeatures: {
          // 启用 JSX 支持
          jsx: true,
        },
      },
    },
    rules: {
      // 允许使用 // @ts-ignore 等 TypeScript 注释 用于临时忽略类型检查错误
      '@typescript-eslint/ban-ts-comment': 'off',
      // 允许使用被默认禁用的类型 如 {}、Function
      '@typescript-eslint/ban-types': 'off',
      // 不强制要求导出函数 or 模块显式声明返回类型
      '@typescript-eslint/explicit-module-boundary-types': 'off',
      // 允许空函数体 如占位函数 适用于待实现逻辑
      '@typescript-eslint/no-empty-function': 'off',
      // 允许 any 类型
      '@typescript-eslint/no-explicit-any': 'off',
      // 允许使用非空断言操作符 ! 如 foo!.bar
      '@typescript-eslint/no-non-null-assertion': 'off',
      // 允许未使用的表达式 如 a && b()
      '@typescript-eslint/no-unused-expressions': 'off',
      // 允许未使用的变量
      '@typescript-eslint/no-unused-vars': 'off',
      // 允许变量 or 函数在定义前使用 适用于某些代码组织方式 如循环引用
      '@typescript-eslint/no-use-before-define': 'off',
      // 允许使用 require() 导入模块 CommonJS 语法
      '@typescript-eslint/no-var-requires': 'off',
      // 允许不安全的函数类型 如 Function 类型
      '@typescript-eslint/no-unsafe-function-type': 'off',
    },
  },

  // JavaScript -> 配置
  {
    files: ['**/*.js'],
    languageOptions: {
      parser: babelParser,
      parserOptions: {
        requireConfigFile: false,
        babelOptions: {
          presets: ['@babel/preset-env'],
          plugins: [['@babel/plugin-proposal-decorators', { legacy: true }]],
        },
      },
    },
  },

  // Prettier -> 集成配置
  {
    plugins: {
      prettier: prettierPlugin,
    },
    rules: {
      'prettier/prettier': [
        'error',
        {
          printWidth: 100,
          semi: true,
          singleQuote: true,
          trailingComma: 'all',
        },
      ],
      'property-sort-order': 'off',
    },
  },

  // 基础忽略规则
  {
    ignores: [
      '**/node_modules/',
      '**/dist/',
      '**/public/',
      '**/build/',
      '**/.git/',
      '**/.vscode/',
      '**/.idea/',
      '**/.husky/',
      '**/.local/',
      '**/.turbo/',
      '**/Dockerfile',
      '**/*.sh',
      '**/*.md',
      '**/*.woff',
      '**/*.ttf',
      '**/*.d.ts',
      '**/__snapshots__/',
    ]
  },

  // 跳过格式化
  skipFormatting,
)
